package com.funcablaze.func;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 属性转换器
 */
public class AttributeConverter {
	private static final Map<Class<?>, TypeHandler> handlers = new HashMap<>();
	
	static {
		// 注册基本类型处理器
		addHandler(int.class, Integer::parseInt);
		addHandler(Integer.class, Integer::parseInt);
		addHandler(float.class, Float::parseFloat);
		addHandler(Float.class, Float::parseFloat);
		addHandler(boolean.class, Boolean::parseBoolean);
		addHandler(Boolean.class, Boolean::parseBoolean);
		addHandler(String.class, s -> s);
	}
	
	/**
	 * 自定义类型处理器接口
 	 */
	public interface TypeHandler<T> {
		T handle(String value) throws Exception;
	}
	
	/**
	 * 注册类型处理器
	 * @param type 目标类型
	 * @param handler 处理器
	 */
	public static <T> void addHandler(Class<T> type, TypeHandler<T> handler) {
		handlers.put(type, handler);
	}
	
	/**
	 * 转换属性值
 	 */
	public static Object convert(String value, Class<?> targetType) throws Exception {
		TypeHandler handler = handlers.get(targetType);
		if (handler != null) {
			return handler.handle(value);
		}
		
		// 处理枚举类型
		if (targetType.isEnum()) {
			return Enum.valueOf((Class<Enum>) targetType, value.toUpperCase());
		}
		
		throw new IllegalArgumentException("Unsupported type: " + targetType.getName());
	}
	
	/**
	 * 查找属性对应的setter方法
	 * @param clazz 目标类
	 * @param setterName setter方法名
	 * @param value 属性值
	 * @return setter方法，如果找不到则返回null
	 */
	public static Method findSetter(Class<?> clazz, String setterName, String value) {
		for (Method method : clazz.getMethods()) {
			if (method.getName().equals(setterName)
					&& method.getParameterCount() == 1
					&& isCompatibleType(method.getParameterTypes()[0], value)) {
				return method;
			}
		}
		return null;
	}
	
	/**
	 * 判断属性值是否与类型兼容
	 * @param type 目标类型
	 * @param value 属性值
	 * @return 兼容
	 */
	public static boolean isCompatibleType(Class<?> type, String value) {
		try {
			AttributeConverter.convert(value, type);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * 将字符串转换为驼峰命名
	 * @param input 输入字符串
	 * @return 转换后的驼峰命名
	 */
	public static String toCamelCase(String input) {
		StringBuilder result = new StringBuilder();
		boolean nextUpper = false;
		
		for (char c : input.toCharArray()) {
			if (c == '-') {
				nextUpper = true;
			} else {
				if (nextUpper) {
					result.append(Character.toUpperCase(c));
					nextUpper = false;
				} else {
					result.append(c);
				}
			}
		}
		return result.toString();
	}
	
	/**
	 * 处理属性转换错误
	 * @param attr 属性名
	 * @param value 属性值
	 * @param e 错误信息
	 */
	public static void handleError(String attr, String value, Exception e) {
		System.err.printf("设置属性失败 [%s=%s]: %s%n",
				attr, value, e.getMessage());
	}
}